package com.zmn.mcc.business.interfaces.staff;

import com.zmn.common.dto.LoginStaff;
import com.zmn.common.dto2.ResponseDTO;
import com.zmn.cube.common.dro.measure.MeasureDRO;
import com.zmn.cube.common.dro.menu.MenuDRO;
import com.zmn.mcc.common.constant.DpermitConsts;
import com.zmn.mcc.model.dto.dpermit.DpermitSimpleDO;
import com.zmn.mcc.model.entity.staff.McStaffDpermit;

import java.util.List;

/**
 * @author heguanghua
 * @since 2020/04/14 22:28
 */
public interface StaffDpermitBService {

    /**
     * 取得指定及其下级的数据权限列表
     *
     * @param staffId       员工ID
     * @param dataType      数据权限类型 {@link DpermitConsts#TYPE_ORGANIZE}
     * @param dataParentIds
     * @return
     */
    List<McStaffDpermit> listDpermitForSelfAndSub(Integer staffId, Integer dataType, List<Integer> dataParentIds);

    /**
     * 取得员工的全部组织数据权限列表
     * 包括平台、大区、子公司及其服务商子集
     *
     * @param staffId 员工ID
     * @param status
     * @return
     */
    ResponseDTO listOrganizeDpermit(Integer staffId, Integer status);

    /**
     * 取得员工的全部账户权限列表
     * 包括平台、大区、子公司及其服务商子集
     *
     * @param staffId 员工ID
     * @param status
     * @return
     */
    ResponseDTO listAccountDpermit(Integer staffId, Integer status);

    /**
     * 取得员工的全部部门数据权限列表
     * 包括一级、二级、三级部门
     *
     * @param staffId 员工ID
     * @param status
     * @return
     */
    ResponseDTO listDeptDpermit(Integer staffId, Integer status);

    /**
     * 取得员工的全部区域数据权限列表
     * 包括省、市、区县
     *
     * @param staffId 员工ID
     * @param status
     * @return
     */
    ResponseDTO listAreaDpermit(Integer staffId, Integer status);

    /**
     * 取得员工的全部渠道数据权限列表
     * 包括下单平台及其一级渠道子集
     *
     * @param staffId 员工ID
     * @param status
     * @return
     */
    ResponseDTO listChannelDpermit(Integer staffId, Integer status);

    /**
     * 取得员工的全部大数据报表数据权限列表
     * 包括一级、二级、三级菜单
     *
     * @param staffId 员工ID
     * @param status
     * @param menus   原始大数据报表菜单对象集合
     * @return
     */
    ResponseDTO listCubeDpermit(Integer staffId, Integer status, List<MenuDRO> menus);

    /**
     * 取得员工的全部产品数据权限列表
     * 包括一级、二级、三级
     *
     * @param staffId 员工ID
     * @param status
     * @return
     */
    ResponseDTO listProductDpermit(Integer staffId, Integer status);

    /**
     * 分配平台、大区、子公司数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID(平台为plat标识，大区和子公司为组织架构ID)
     * @param loginStaff 操作人
     * @param ip         IP
     * @return
     */
    ResponseDTO assignOrganizeDpermit(Integer staffId, List<Integer> dpermitIds, LoginStaff loginStaff, String ip);

    /**
     * 分配账户数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID(平台为plat标识，大区和子公司为组织架构ID)
     * @param loginStaff 操作人
     * @param ip         IP
     * @return
     */
    ResponseDTO assignPromotionDpermit(Integer staffId, List<Integer> dpermitIds, List<Integer> account, LoginStaff loginStaff, String ip, Integer type);

    /**
     * 分配渠道数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID(平台为plat标识，大区和子公司为组织架构ID)
     * @param loginStaff 操作人
     * @param ip         IP
     * @return
     */
    ResponseDTO assignNewChannelDpermit(Integer staffId, List<Integer> dpermitIds, LoginStaff loginStaff, String ip);

    /**
     * 添加服务商数据权限
     * 同时添加相关上级组织数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param companyIds 数据权限ID(服务商公司ID)
     * @param operatorId 操作人staffId
     * @param operator   操作人
     * @return
     */
    ResponseDTO addOrganizeDpermitForSp(Integer staffId, List<Integer> companyIds, Integer operatorId, String operator);

    /**
     * 移除子公司及其服务商数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param orgId      数据权限ID(子公司的组织ID)
     * @param operatorId 操作人staffId
     * @return
     */
    ResponseDTO deleteOrganizeDpermit(Integer staffId, Integer orgId, Integer operatorId, String operator);

    /**
     * 移除指定服务商数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param companyId  数据权限ID(服务商公司ID)
     * @param operatorId 操作人staffId
     * @param operator   操作人
     * @return
     */
    ResponseDTO deleteOrganizeDpermitForSp(Integer staffId, Integer companyId, Integer operatorId, String operator);

    /**
     * 清除全部组织数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearOrganizeDpermit(Integer staffId, LoginStaff loginStaff, String ip);

    /**
     * 清除全部推广数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearPromotionDpermit(Integer staffId, LoginStaff loginStaff, String ip);

    /**
     * 清除全部渠道数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearNewchannelDpermit(Integer staffId, LoginStaff loginStaff, String ip);


    /**
     * 分配一级、二级和三级部门数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID(部门ID)
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO assignDeptDpermit(Integer staffId, List<Integer> dpermitIds, LoginStaff loginStaff, String ip);

    /**
     * 清除全部部门数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearDeptDpermit(Integer staffId, LoginStaff loginStaff, String ip);


    /**
     * 分配省、市、区县数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID(区域ID)
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO assignAreaDpermit(Integer staffId, List<Integer> dpermitIds, LoginStaff loginStaff, String ip);

    /**
     * 清除全部区域数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearAreaDpermit(Integer staffId, LoginStaff loginStaff, String ip);


    /**
     * 分配下单平台数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID(平台plat标识)
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO assignChannelDpermitForPlat(Integer staffId, List<Integer> dpermitIds, LoginStaff loginStaff, String ip);

    /**
     * 添加渠道数据权限
     * 同时添加上级渠道数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param channelIds 数据权限ID(渠道ID)
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO addChannelDpermit(Integer staffId, List<Integer> channelIds, LoginStaff loginStaff, String ip);

    /**
     * 移除指定平台及其渠道数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param plat       数据权限ID(平台plat标识)
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO deleteChannelDpermit(Integer staffId, Integer plat, LoginStaff loginStaff, String ip);

    /**
     * 移除指定渠道(一级、二级渠道)数据权限
     * 同时移除下级渠道数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param channelIds 数据权限ID(渠道ID)
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO deleteChannelDpermit(Integer staffId, List<Integer> channelIds, LoginStaff loginStaff, String ip);

    /**
     * 清除全部渠道(下单平台、一级、二级渠道)数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearChannelDpermit(Integer staffId, LoginStaff loginStaff, String ip);


    /**
     * 分配一级、二级、三级大数据报表数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID(大数据报表菜单ID)
     * @param menus      原始大数据报表菜单对象集合
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO assignCubeDpermit(Integer staffId, List<Integer> dpermitIds, List<MenuDRO> menus, LoginStaff loginStaff, String ip);

    /**
     * 清除全部大数据报表数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearCubeDpermit(Integer staffId, LoginStaff loginStaff, String ip);


    /**
     * 分配一级、二级、三级产品数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID和level
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO assignProductDpermit(Integer staffId, List<String> dpermitIds, LoginStaff loginStaff, String ip);

    /**
     * 清除全部产品数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearProductDpermit(Integer staffId, LoginStaff loginStaff, String ip);

    /**
     * 取得员工的全部大数据指标数据权限列表
     *
     * @param staffId  员工
     * @param status
     * @param measures 原始大数据指标对象集合
     * @return
     */
    ResponseDTO<List<DpermitSimpleDO>> listMeasureDpermit(Integer staffId, int status, List<MeasureDRO> measures);

    /**
     * 分配一级、二级、三级大数据报表指标权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param dpermitIds 数据权限ID（大数据报表指标ID）
     * @param measures   原始大数据报表指标对象集合
     * @param loginStaff 操作人
     * @param ip         IP
     * @return
     */
    ResponseDTO assignMeasureDpermit(Integer staffId, List<Integer> dpermitIds, List<MeasureDRO> measures, LoginStaff loginStaff, String ip);

    /**
     * 清除全部大数据报表指标数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId    员工ID
     * @param loginStaff 操作人
     * @param ip         ip
     * @return
     */
    ResponseDTO clearMeasureDpermit(Integer staffId, LoginStaff loginStaff, String ip);

    /**
     * 新渠道数据权限
     * 确保在操作人拥有"系统全局角色"才可操作
     *
     * @param staffId      员工ID
     * @param statusEnable 状态
     * @return
     */
    ResponseDTO listNewchannelDpermit(Integer staffId, int statusEnable);
}
